home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / tcltk / tk8.4 / choosedir.tcl < prev    next >
Text File  |  2009-04-29  |  9KB  |  292 lines

  1. # choosedir.tcl --
  2. #
  3. #    Choose directory dialog implementation for Unix/Mac.
  4. #
  5. # Copyright (c) 1998-2000 by Scriptics Corporation.
  6. # All rights reserved.
  7. # RCS: @(#) $Id: choosedir.tcl,v 1.15.2.2 2006/01/25 18:21:41 dgp Exp $
  8.  
  9. # Make sure the tk::dialog namespace, in which all dialogs should live, exists
  10. namespace eval ::tk::dialog {}
  11. namespace eval ::tk::dialog::file {}
  12.  
  13. # Make the chooseDir namespace inside the dialog namespace
  14. namespace eval ::tk::dialog::file::chooseDir {
  15.     namespace import -force ::tk::msgcat::*
  16. }
  17.  
  18. # ::tk::dialog::file::chooseDir:: --
  19. #
  20. #    Implements the TK directory selection dialog.
  21. #
  22. # Arguments:
  23. #    args        Options parsed by the procedure.
  24. #
  25. proc ::tk::dialog::file::chooseDir:: {args} {
  26.     variable ::tk::Priv
  27.     set dataName __tk_choosedir
  28.     upvar ::tk::dialog::file::$dataName data
  29.     ::tk::dialog::file::chooseDir::Config $dataName $args
  30.  
  31.     if {$data(-parent) eq "."} {
  32.         set w .$dataName
  33.     } else {
  34.         set w $data(-parent).$dataName
  35.     }
  36.  
  37.     # (re)create the dialog box if necessary
  38.     #
  39.     if {![winfo exists $w]} {
  40.     ::tk::dialog::file::Create $w TkChooseDir
  41.     } elseif {[winfo class $w] ne "TkChooseDir"} {
  42.     destroy $w
  43.     ::tk::dialog::file::Create $w TkChooseDir
  44.     } else {
  45.     set data(dirMenuBtn) $w.f1.menu
  46.     set data(dirMenu) $w.f1.menu.menu
  47.     set data(upBtn) $w.f1.up
  48.     set data(icons) $w.icons
  49.     set data(ent) $w.f2.ent
  50.     set data(okBtn) $w.f2.ok
  51.     set data(cancelBtn) $w.f2.cancel
  52.     set data(hiddenBtn) $w.f2.hidden
  53.     }
  54.     if {$::tk::dialog::file::showHiddenBtn} {
  55.     $data(hiddenBtn) configure -state normal
  56.     grid $data(hiddenBtn)
  57.     } else {
  58.     $data(hiddenBtn) configure -state disabled
  59.     grid remove $data(hiddenBtn)
  60.     }
  61.  
  62.     # Dialog boxes should be transient with respect to their parent,
  63.     # so that they will always stay on top of their parent window.  However,
  64.     # some window managers will create the window as withdrawn if the parent
  65.     # window is withdrawn or iconified.  Combined with the grab we put on the
  66.     # window, this can hang the entire application.  Therefore we only make
  67.     # the dialog transient if the parent is viewable.
  68.  
  69.     if {[winfo viewable [winfo toplevel $data(-parent)]] } {
  70.     wm transient $w $data(-parent)
  71.     }
  72.  
  73.     trace add variable data(selectPath) write [list ::tk::dialog::file::SetPath $w]
  74.     $data(dirMenuBtn) configure \
  75.         -textvariable ::tk::dialog::file::${dataName}(selectPath)
  76.  
  77.     set data(filter) "*"
  78.     set data(previousEntryText) ""
  79.     ::tk::dialog::file::UpdateWhenIdle $w
  80.  
  81.     # Withdraw the window, then update all the geometry information
  82.     # so we know how big it wants to be, then center the window in the
  83.     # display and de-iconify it.
  84.  
  85.     ::tk::PlaceWindow $w widget $data(-parent)
  86.     wm title $w $data(-title)
  87.  
  88.     # Set a grab and claim the focus too.
  89.  
  90.     ::tk::SetFocusGrab $w $data(ent)
  91.     $data(ent) delete 0 end
  92.     $data(ent) insert 0 $data(selectPath)
  93.     $data(ent) selection range 0 end
  94.     $data(ent) icursor end
  95.  
  96.     # Wait for the user to respond, then restore the focus and
  97.     # return the index of the selected button.  Restore the focus
  98.     # before deleting the window, since otherwise the window manager
  99.     # may take the focus away so we can't redirect it.  Finally,
  100.     # restore any grab that was in effect.
  101.  
  102.     vwait ::tk::Priv(selectFilePath)
  103.  
  104.     ::tk::RestoreFocusGrab $w $data(ent) withdraw
  105.  
  106.     # Cleanup traces on selectPath variable
  107.     #
  108.  
  109.     foreach trace [trace info variable data(selectPath)] {
  110.     trace remove variable data(selectPath) [lindex $trace 0] [lindex $trace 1]
  111.     }
  112.     $data(dirMenuBtn) configure -textvariable {}
  113.  
  114.     # Return value to user
  115.     #
  116.     
  117.     return $Priv(selectFilePath)
  118. }
  119.  
  120. # ::tk::dialog::file::chooseDir::Config --
  121. #
  122. #    Configures the Tk choosedir dialog according to the argument list
  123. #
  124. proc ::tk::dialog::file::chooseDir::Config {dataName argList} {
  125.     upvar ::tk::dialog::file::$dataName data
  126.  
  127.     # 0: Delete all variable that were set on data(selectPath) the
  128.     # last time the file dialog is used. The traces may cause troubles
  129.     # if the dialog is now used with a different -parent option.
  130.     #
  131.     foreach trace [trace info variable data(selectPath)] {
  132.     trace remove variable data(selectPath) [lindex $trace 0] [lindex $trace 1]
  133.     }
  134.  
  135.     # 1: the configuration specs
  136.     #
  137.     set specs {
  138.     {-mustexist "" "" 0}
  139.     {-initialdir "" "" ""}
  140.     {-parent "" "" "."}
  141.     {-title "" "" ""}
  142.     }
  143.  
  144.     # 2: default values depending on the type of the dialog
  145.     #
  146.     if {![info exists data(selectPath)]} {
  147.     # first time the dialog has been popped up
  148.     set data(selectPath) [pwd]
  149.     }
  150.  
  151.     # 3: parse the arguments
  152.     #
  153.     tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList
  154.  
  155.     if {$data(-title) eq ""} {
  156.     set data(-title) "[mc "Choose Directory"]"
  157.     }
  158.     
  159.     # Stub out the -multiple value for the dialog; it doesn't make sense for
  160.     # choose directory dialogs, but we have to have something there because we
  161.     # share so much code with the file dialogs.
  162.     set data(-multiple) 0
  163.  
  164.     # 4: set the default directory and selection according to the -initial
  165.     #    settings
  166.     #
  167.     if {$data(-initialdir) ne ""} {
  168.     # Ensure that initialdir is an absolute path name.
  169.     if {[file isdirectory $data(-initialdir)]} {
  170.         set old [pwd]
  171.         cd $data(-initialdir)
  172.         set data(selectPath) [pwd]
  173.         cd $old
  174.     } else {
  175.         set data(selectPath) [pwd]
  176.     }
  177.     }
  178.  
  179.     if {![winfo exists $data(-parent)]} {
  180.     error "bad window path name \"$data(-parent)\""
  181.     }
  182. }
  183.  
  184. # Gets called when user presses Return in the "Selection" entry or presses OK.
  185. #
  186. proc ::tk::dialog::file::chooseDir::OkCmd {w} {
  187.     upvar ::tk::dialog::file::[winfo name $w] data
  188.  
  189.     # This is the brains behind selecting non-existant directories.  Here's
  190.     # the flowchart:
  191.     # 1.  If the icon list has a selection, join it with the current dir,
  192.     #     and return that value.
  193.     # 1a.  If the icon list does not have a selection ...
  194.     # 2.  If the entry is empty, do nothing.
  195.     # 3.  If the entry contains an invalid directory, then...
  196.     # 3a.   If the value is the same as last time through here, end dialog.
  197.     # 3b.   If the value is different than last time, save it and return.
  198.     # 4.  If entry contains a valid directory, then...
  199.     # 4a.   If the value is the same as the current directory, end dialog.
  200.     # 4b.   If the value is different from the current directory, change to
  201.     #       that directory.
  202.  
  203.     set selection [tk::IconList_Curselection $data(icons)]
  204.     if { [llength $selection] != 0 } {
  205.     set iconText [tk::IconList_Get $data(icons) [lindex $selection 0]]
  206.     set iconText [file join $data(selectPath) $iconText]
  207.     ::tk::dialog::file::chooseDir::Done $w $iconText
  208.     } else {
  209.     set text [$data(ent) get]
  210.     if { $text eq "" } {
  211.         return
  212.     }
  213.     set text [eval file join [file split [string trim $text]]]
  214.     if { ![file exists $text] || ![file isdirectory $text] } {
  215.         # Entry contains an invalid directory.  If it's the same as the
  216.         # last time they came through here, reset the saved value and end
  217.         # the dialog.  Otherwise, save the value (so we can do this test
  218.         # next time).
  219.         if { $text eq $data(previousEntryText) } {
  220.         set data(previousEntryText) ""
  221.         ::tk::dialog::file::chooseDir::Done $w $text
  222.         } else {
  223.         set data(previousEntryText) $text
  224.         }
  225.     } else {
  226.         # Entry contains a valid directory.  If it is the same as the
  227.         # current directory, end the dialog.  Otherwise, change to that
  228.         # directory.
  229.         if { $text eq $data(selectPath) } {
  230.         ::tk::dialog::file::chooseDir::Done $w $text
  231.         } else {
  232.         set data(selectPath) $text
  233.         }
  234.     }
  235.     }
  236.     return
  237. }
  238.  
  239. proc ::tk::dialog::file::chooseDir::DblClick {w} {
  240.     upvar ::tk::dialog::file::[winfo name $w] data
  241.     set selection [tk::IconList_Curselection $data(icons)]
  242.     if { [llength $selection] != 0 } {
  243.     set filenameFragment \
  244.         [tk::IconList_Get $data(icons) [lindex $selection 0]]
  245.     set file $data(selectPath)
  246.     if {[file isdirectory $file]} {
  247.         ::tk::dialog::file::ListInvoke $w [list $filenameFragment]
  248.         return
  249.     }
  250.     }
  251. }    
  252.  
  253. # Gets called when user browses the IconList widget (dragging mouse, arrow
  254. # keys, etc)
  255. #
  256. proc ::tk::dialog::file::chooseDir::ListBrowse {w text} {
  257.     upvar ::tk::dialog::file::[winfo name $w] data
  258.  
  259.     if {$text eq ""} {
  260.     return
  261.     }
  262.  
  263.     set file [::tk::dialog::file::JoinFile $data(selectPath) $text]
  264.     $data(ent) delete 0 end
  265.     $data(ent) insert 0 $file
  266. }
  267.  
  268. # ::tk::dialog::file::chooseDir::Done --
  269. #
  270. #    Gets called when user has input a valid filename.  Pops up a
  271. #    dialog box to confirm selection when necessary. Sets the
  272. #    Priv(selectFilePath) variable, which will break the "vwait"
  273. #    loop in tk_chooseDirectory and return the selected filename to the
  274. #    script that calls tk_getOpenFile or tk_getSaveFile
  275. #
  276. proc ::tk::dialog::file::chooseDir::Done {w {selectFilePath ""}} {
  277.     upvar ::tk::dialog::file::[winfo name $w] data
  278.     variable ::tk::Priv
  279.  
  280.     if {$selectFilePath eq ""} {
  281.     set selectFilePath $data(selectPath)
  282.     }
  283.     if { $data(-mustexist) } {
  284.     if { ![file exists $selectFilePath] || \
  285.         ![file isdir $selectFilePath] } {
  286.         return
  287.     }
  288.     }
  289.     set Priv(selectFilePath) $selectFilePath
  290. }
  291.